<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 原型链
    // 原型(__proto__)      有就找自己的，没有就顺着__proto__找构造函数的原型对象
    // 原型对象(.prototype)  本质：对象(实例化对象 => 构造函数Object创建)
    // 实例化对象(Tom)


    function Cat(name, color) {
        this.name = name;
        this.color = color;
    }
    Cat.prototype.species = "猫";
    Cat.prototype.call = function () {
        console.log("喵喵");
    };
    Cat.prototype.skill = function () {
        console.log("抓老鼠");
    };

    var Tom = new Cat("Tom", "green");
    console.log(Tom);
    console.log(Tom.color);      //自己有找自己的
    console.log(Tom.species);    //自己没有找__proto__  =>  Cat.prototype
    console.log(Tom.toString);   //Cat.prototype 没有顺着__proto__找  =>  Object.prototype
    console.log(Tom.haha);      //原型链上都没有 =>  返回 undefined



    // 原型链   属性和方法的链式查找机制
    // Tom  -> Tom.__proto__(Cat.prototype) -> Tom.__proto__.__proto__(Object.prototype) -> null


    // 实例化对象的原型  指向  构造函数的原型对象(创建该实例化对象的构造函数)
    console.log(Tom.__proto__ === Cat.prototype)                // true
    // 还是没有就继续找 原型对象 的 原型对象
    console.log(Tom.__proto__.__proto__ === Object.prototype)   // true
    // 还没找到 强制指向为空
    console.log(Object.prototype.__proto__ === null);           // true


    // 所有的实例化对象都可以使用Object.prototype上的对象

</script>

</html>